package com.chase.framerwork.excel;

import java.net.URLEncoder;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFRow;

import com.chase.framerwork.common.Globle;
import com.chase.framerwork.util.DateUtil;

/**
 * 解析Excel文件的最父类
 * 
 * @author chase
 */
public abstract class AbstractParseExcel<E>
{
	/**
	 * 导出人
	 */
	private static final String IMPORT_USER = "importUser";

	/**
	 * 导出日期
	 */
	private static final String IMPORT_DATE = "importDate";

	/**
	 * 抽象方法,交给子类实现,用于建立具体解析Excel规则.
	 * 
	 * @param request
	 *            request对象
	 * @param excel
	 *            读取到的Excel对象
	 * @param objects
	 *            写入Excel所需要的一些特殊参数.
	 * @return List list中包含一个泛型对象,改对象是解析Excel之后封装到List中的实体对象.
	 * @throws Exception
	 */
	public abstract List<E> readExcel(HttpServletRequest request, Excel excel, Object... objects) throws Exception;

	/**
	 * 抽象方法，交给子类实现,用户简历具体创建Excel规则.
	 * 
	 * @param response
	 *            response对象
	 * @param excel
	 *            创建好的Excel对象
	 * @param resultList
	 *            需要写入Excel结果集
	 * @param objects
	 *            写入Excel所需要的一些特殊参数.
	 * @throws Exception
	 */
	public abstract void writeExcel(HttpServletResponse response, Excel excel, List<E> resultList, Object... objects)
	        throws Exception;

	/**
	 * 设置Excel头信息(写入Excel时使用)
	 * 
	 * @param excel
	 *            Excel对象
	 * @param titles
	 *            Excel第一行的头信息
	 */
	protected void setHeader(Excel excel, String[] titles)
	{
		HSSFRow row = excel.createRow(0); // 创建第一行

		for (int i = 0; i < titles.length; i++)
		{
			row.createCell(i).setCellValue(titles[i]);
		}
	}

	/**
	 * 设置Excel导出信息,包括导出人，导出日期等
	 * 
	 * @param excel
	 *            Excel对象
	 */
	protected void setFooter(Excel excel)
	{
		HSSFRow row = excel.createRow(excel.getRowCount() + 2);
		row.createCell(0).setCellValue(IMPORT_USER);
		row.createCell(1).setCellValue(Globle.getUser().getUsername()); // 设置导出人

		HSSFRow row2 = excel.createRow(excel.getRowCount() + 1);
		row2.createCell(0).setCellValue(IMPORT_DATE);
		row2.createCell(1).setCellValue(DateUtil.getCurrentDate()); // 设置导出时间
	}

	/**
	 * 响应Excel,输出至页面
	 * 
	 * @param response
	 * @param excel
	 */
	protected void responseExcel(HttpServletResponse response, Excel excel) throws Exception
	{
		response.setContentType("application/vnd.ms-excel");
		response.setHeader("Content-Disposition",
		        "attachment;filename=" + URLEncoder.encode(excel.getFileName(), Globle.CHARSET) + Globle.EXCEL_POSTFIX);

		excel.getWorkbook().write(response.getOutputStream());
	}
}
